/**********************************************************
 * 	Sprite 类的扩展类，加入位图缓存功能，使显示/隐藏效果得以实现
 * 	该类为一个基类，其它类多数由它来继承
 * 	新的要显示对象只有旋转在 _root 上才可以开启位图模式
 * 
 * 	提供外部调用或重写的接口：
 * 			SetPlace(xx,yy)		定位对象位置
 * 			OpenBitmap(ww,hh)	开启位图缓存
 * 			CloseBitmap()		关闭位图缓存
 * 			GetMovie(str)		从库里面产生一个类对象		
 * 	提供的接口：
 * 			get _root		取得对象层
 * 			get _hot		取得底部热区层
 * 			get _bmp		取得位图缓存层
 *********************************************************/

package org.dstart.csuper
{
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.utils.getDefinitionByName;
	import flash.geom.Rectangle;

	public class SuperSprite extends Sprite
	{
		private var m_sprHot:Sprite;	//	背景框对象，该对象主要用于显示一些遮照区，不做表现用
		private var m_sprMain:Sprite;	//	主体绘制用对象（所有对象在这上面进行绘制）
		private var m_bmpMain:Bitmap;	//	主体显示对象（用于外部调用时的显示）
		
		public function SuperSprite()
		{
			InitObject();
		}

		/** 返回透明遮片层 */
		public function get _hot():Sprite
		{
			return m_sprHot;
		}

		/**	返回用于绘制对象用的主体 Sprite */
		public function get _root():Sprite
		{
			return m_sprMain;
		}
		
		/** 返回位图对象 */
		public function get _bmp():Bitmap
		{
			return m_bmpMain;
		}

		/**	设置对象的 X Y 坐标位置 */
		public function SetPlace(x:Number, y:Number):void
		{
			this.x = x;
			this.y = y;
		}
		
		/** 设置缓存位置 */
		public function SetBmpPlace(xx:Number, yy:Number):void
		{
			_root.x = _bmp.x = _hot.x = x;
			_root.y = _bmp.y = _hot.y = y;
		}
		
		/** 开启位图模式 */
		public function OpenBitmap(ww:Number = 0, hh:Number = 0, isAlpha:Boolean = true):void
		{
			// trace(this, this.name," is openbitmap");
			
			_root.visible = false;

			RushBitmap(ww, hh, isAlpha);
			
			this.addChild(this._bmp);
		}
		
		/**	关闭位图模式 */
		public function CloseBitmap():void
		{
			// trace(this, this.name, " closebitmap");
			
			_root.visible = true;
			
			if(_bmp)
			{
				if(_bmp.bitmapData)
				{
					_bmp.bitmapData.dispose();
				}
				_bmp.visible = false;
			}			
		}
		
		/** 从库里调出一个对象 **/		
		public function GetMovie(str:String):*
		{
			var mClass:Class = flash.utils.getDefinitionByName(str) as Class;
			
			if(mClass)
			{
				return new mClass();
			}
			else
			{
				return null;
			}		
		}	

		//-----------------------------------------------------------------------

		/**	刷新位图对象，进行更新 */
		protected function RushBitmap(w:Number, h:Number, isAlpha:Boolean = true):void
		{
			if(_bmp)
			{
				if(_bmp.bitmapData)
				{
					_bmp.bitmapData.dispose();
				}
			}

			var rect:Rectangle = this._root.getBounds(this);
			
			var xx:Number = Math.floor(_bmp.x - _root.x);
			var yy:Number = Math.floor(_bmp.y - _root.y);;
			var ww:Number = this.width;//rect.width + 5;//this.width + 5;//rect.width + 5;
			var hh:Number = this.height;//rect.height + 5;//this.height + 5;//rect.height + 5;
			
			ww = (ww <= 0) ? 1 : ww;
			hh = (hh <= 0) ? 1 : hh;	
			
			ww = (w > 0) ? w : ww;
			hh = (h > 0) ? h : ww;
			
			ww = (ww > 2000) ? 2000 : ww;
			hh = (hh > 2000) ? 2000 : hh;
			
			_bmp.bitmapData = new BitmapData(Math.abs(ww), Math.abs(hh), isAlpha, 0xFFCCCC);
			_bmp.bitmapData.draw(_root);//, null, null, null, new Rectangle(xx, yy, Math.abs(ww), Math.abs(hh)), true);

			_bmp.visible = true;
			
			this.addChild(_bmp);
		}
			
		//-----------------------------------------------------------------------
		
		/**	初始化对象 */
		private function InitObject():void
		{
			m_sprHot  = new Sprite();
			m_sprMain = new Sprite();
			m_bmpMain = new Bitmap();
			
			m_bmpMain.smoothing = true;
			
			this.addChild(m_sprHot);
			this.addChild(m_sprMain);
			this.addChild(m_bmpMain);
			
			this._root.cacheAsBitmap = true;
			this._hot.cacheAsBitmap = true;
			this._bmp.cacheAsBitmap = true;
			
			this.cacheAsBitmap = true;
		}
	}
}